home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / pibt3sp2.arc / PIBCRC.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-07-06  |  4.8 KB  |  79 lines

  1. (*----------------------------------------------------------------------*)
  2. (*             Update_Crc --- Update cyclic redundancy check            *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. VAR                                (* Easier addressing in INLINE *)
  6.    Global_Crc : INTEGER;
  7.  
  8. FUNCTION Update_Crc( Old_Crc : INTEGER; C : BYTE ) : INTEGER;
  9.  
  10. (*----------------------------------------------------------------------*)
  11. (*                                                                      *)
  12. (*     Function:   Update_Crc                                           *)
  13. (*                                                                      *)
  14. (*     Purpose:    Computes cyclic redundancy check for 1 character     *)
  15. (*                                                                      *)
  16. (*     Calling Sequence:                                                *)
  17. (*                                                                      *)
  18. (*        New_Crc := Update_Crc( Old_Crc : INTEGER;                     *)
  19. (*                               C       : BYTE ) : INTEGER;            *)
  20. (*                                                                      *)
  21. (*           Old_Crc --- previous CRC value.                            *)
  22. (*           C       --- character for which CRC is computed.           *)
  23. (*           New_Crc --- updated CRC.                                   *)
  24. (*                                                                      *)
  25. (*     Calls:    None                                                   *)
  26. (*                                                                      *)
  27. (*     Remarks:  An equivalent Pascal routine for this inline code is:  *)
  28. (*                                                                      *)
  29. (*----------------------------------------------------------------------*)
  30. (*                                                                      *)
  31. (*    FUNCTION Update_Crc( Old_Crc : INTEGER; C : BYTE ) : INTEGER;     *)
  32. (*                                                                      *)
  33. (*    VAR                                                               *)
  34. (*       I     : INTEGER;                                               *)
  35. (*       Carry : BOOLEAN;                                               *)
  36. (*                                                                      *)
  37. (*    BEGIN                                                             *)
  38. (*                                                                      *)
  39. (*       FOR I := 1 TO 8 DO                                             *)
  40. (*          BEGIN                                                       *)
  41. (*                                                                      *)
  42. (*             Carry   := ( Old_Crc AND $8000 ) <> 0;                   *)
  43. (*             Old_Crc := Old_Crc SHL 1;                                *)
  44. (*                                                                      *)
  45. (*             IF ( C AND $80 ) <> 0 THEN                               *)
  46. (*                Old_Crc := Old_Crc OR 1;                              *)
  47. (*                                                                      *)
  48. (*             IF Carry THEN                                            *)
  49. (*                Old_Crc := Old_Crc XOR $1021;                         *)
  50. (*                                                                      *)
  51. (*             C       := C SHL 1;                                      *)
  52. (*                                                                      *)
  53. (*          END;                                                        *)
  54. (*                                                                      *)
  55. (*       Update_Crc := Old_Crc;                                         *)
  56. (*                                                                      *)
  57. (*    END;                                                              *)
  58. (*                                                                      *)
  59. (*----------------------------------------------------------------------*)
  60.  
  61. BEGIN (* Update_Crc *)
  62.  
  63.    Global_Crc := Old_Crc;
  64.  
  65.    INLINE(   $8A / $46 / $04 /        (* Mov     Al,[Bp+4]     *)
  66.              $8B / $1E / Global_Crc / (* Mov     Bx,Global_Crc *)
  67.              $B9 / $08 / $00 /        (* Mov     Cx,8          *)
  68. (* Oloop *)  $D0 / $E0 /              (* Shl     Al,1          *)
  69.              $D1 / $D3 /              (* Rcl     Bx,1          *)
  70.              $73 / $04 /              (* Jnc     Iloop         *)
  71.              $81 / $F3 / $21 / $10 /  (* Xor     Bx,$1021      *)
  72. (* Iloop *)  $E2 / $F4 /              (* Loop    Oloop         *)
  73.              $89 / $1E / Global_Crc ) (* Mov     Global_Crc,BX *);
  74.  
  75.    Update_Crc := Global_Crc;
  76.  
  77. END   (* Update_Crc *);
  78.  
  79.